""" Regular UNOA: UNOA char, CR, LF and Crtl-Z
Adapted by Henk-Jan Ebbers for Bots open source EDI translator
Controls handing of UNOA both incoming (decode) and outgoing (encode).
Values can be converted, eg e->E
Entries not available/commented out give errors for 'strict' handling; this can be controlled via syntax option in grammar:
    'checkcharsetin':'strict', #decode: strict, ignore or botsreplace (replace with char as set in bots.ini).
    'checkcharsetout':'strict', #encode: strict, ignore or botsreplace (replace with char as set in bots.ini).
"""
import codecs

###Codec APIs
class Codec(codecs.Codec):
    def encode(self,input,errors='strict'):
        return codecs.charmap_encode(input,errors,encoding_map)
    def decode(self,input,errors='strict'):
        return codecs.charmap_decode(input,errors,decoding_map)

class StreamWriter(Codec,codecs.StreamWriter):
    pass

class StreamReader(Codec,codecs.StreamReader):
    pass

###encodings module API
class IncrementalEncoder(codecs.IncrementalEncoder):
    def encode(self, input, final=False):
        return codecs.charmap_encode(input,self.errors,encoding_map)[0]

class IncrementalDecoder(codecs.IncrementalDecoder):
    def decode(self, input, final=False):
        return codecs.charmap_decode(input,self.errors,decoding_map)[0]

def getregentry():
    return codecs.CodecInfo(
        name='unoa',
        encode=Codec().encode,
        decode=Codec().decode,
        incrementalencoder=IncrementalEncoder,
        incrementaldecoder=IncrementalDecoder,
        streamreader=StreamReader,
        streamwriter=StreamWriter,
    )

###Decoding (for incoming edifact) ###############################
decoding_map = {
#0x0000:0x0000, #NUL
#0x0001:0x0001, #SOH
#0x0002:0x0002, #STX
#0x0003:0x0003, #ETX
#0x0004:0x0004, #EOT
#0x0005:0x0005, #ENQ
#0x0006:0x0006, #ACK
#0x0007:0x0007, #Bell
#0x0008:0x0008, #BackSpace
#0x0009:0x0009, #Tab
0x000a:0x000a, #lf
#0x000b:0x000b, #Vertical Tab
#0x000c:0x000c, #FormFeed
0x000d:0x000d, #cr
#0x000e:0x000e, #SO
#0x000f:0x000f, #SI
#0x0010:0x0010, #DLE
#0x0011:0x0011, #DC1
#0x0012:0x0012, #DC2
#0x0013:0x0013, #DC3
#0x0014:0x0014, #DC4
#0x0015:0x0015, #NAK
#0x0016:0x0016, #SYN
#0x0017:0x0017, #ETB
#0x0018:0x0018, #CAN
#0x0019:0x0019, #EM
0x001a:0x001a, #SUB, cntrl-Z
#0x001b:0x001b, #ESC
#0x001c:0x001c, #FS
#0x001d:0x001d, #GS
#0x001e:0x001e, #RS
#0x001f:0x001f, #US
0x0020:0x0020, #<space> 
0x0021:0x0021, #!
0x0022:0x0022, #"
#0x0023:0x0023, ##
#0x0024:0x0024, #$
0x0025:0x0025, #%
0x0026:0x0026, #&
0x0027:0x0027, #'
0x0028:0x0028, #(
0x0029:0x0029, #)
0x002a:0x002a, #*
0x002b:0x002b, #+
0x002c:0x002c, #,
0x002d:0x002d, #-
0x002e:0x002e, #.
0x002f:0x002f, #/
0x0030:0x0030, #0
0x0031:0x0031, #1
0x0032:0x0032, #2
0x0033:0x0033, #3
0x0034:0x0034, #4
0x0035:0x0035, #5
0x0036:0x0036, #6
0x0037:0x0037, #7
0x0038:0x0038, #8
0x0039:0x0039, #9
0x003a:0x003a, #:
0x003b:0x003b, #;
0x003c:0x003c, #<
0x003d:0x003d, #=
0x003e:0x003e, #>
0x003f:0x003f, #?
#0x0040:0x0040, #@
0x0041:0x0041, #A
0x0042:0x0042, #B
0x0043:0x0043, #C
0x0044:0x0044, #D
0x0045:0x0045, #E
0x0046:0x0046, #F
0x0047:0x0047, #G
0x0048:0x0048, #H
0x0049:0x0049, #I
0x004a:0x004a, #J
0x004b:0x004b, #K
0x004c:0x004c, #L
0x004d:0x004d, #M
0x004e:0x004e, #N
0x004f:0x004f, #O
0x0050:0x0050, #P
0x0051:0x0051, #Q
0x0052:0x0052, #R
0x0053:0x0053, #S
0x0054:0x0054, #T
0x0055:0x0055, #U
0x0056:0x0056, #V
0x0057:0x0057, #W
0x0058:0x0058, #X
0x0059:0x0059, #Y
0x005a:0x005a, #Z
#0x005b:0x005b, #[
#0x005c:0x005c, #\
#0x005d:0x005d, #]
#0x005e:0x005e, #^
#0x005f:0x005f, #_
#0x0060:0x0060, #`
#0x0061:0x0061, #a
#0x0062:0x0062, #b
#0x0063:0x0063, #c
#0x0064:0x0064, #d
#0x0065:0x0065, #e
#0x0066:0x0066, #f
#0x0067:0x0067, #g
#0x0068:0x0068, #h
#0x0069:0x0069, #i
#0x006a:0x006a, #j
#0x006b:0x006b, #k
#0x006c:0x006c, #l
#0x006d:0x006d, #m
#0x006e:0x006e, #n
#0x006f:0x006f, #o
#0x0070:0x0070, #p
#0x0071:0x0071, #q
#0x0072:0x0072, #r
#0x0073:0x0073, #s
#0x0074:0x0074, #t
#0x0075:0x0075, #u
#0x0076:0x0076, #v
#0x0077:0x0077, #w
#0x0078:0x0078, #x
#0x0079:0x0079, #y
#0x007a:0x007a, #z
#0x007b:0x007b, #{
#0x007c:0x007c, #|
#0x007d:0x007d, #}
#0x007e:0x007e, #~
#0x007f:0x007f, #del
}

###Encoding (for outgoing edifact) ###############################
encoding_map = {
#0x0000:0x0000, #NUL
#0x0001:0x0001, #SOH
#0x0002:0x0002, #STX
#0x0003:0x0003, #ETX
#0x0004:0x0004, #EOT
#0x0005:0x0005, #ENQ
#0x0006:0x0006, #ACK
#0x0007:0x0007, #Bell
#0x0008:0x0008, #BackSpace
#0x0009:0x0009, #Tab
0x000a:0x000a, #lf
#0x000b:0x000b, #Vertical Tab
#0x000c:0x000c, #FormFeed
0x000d:0x000d, #cr
#0x000e:0x000e, #SO
#0x000f:0x000f, #SI
#0x0010:0x0010, #DLE
#0x0011:0x0011, #DC1
#0x0012:0x0012, #DC2
#0x0013:0x0013, #DC3
#0x0014:0x0014, #DC4
#0x0015:0x0015, #NAK
#0x0016:0x0016, #SYN
#0x0017:0x0017, #ETB
#0x0018:0x0018, #CAN
#0x0019:0x0019, #EM
0x001a:0x001a, #SUB, cntrl-Z
#0x001b:0x001b, #ESC
#0x001c:0x001c, #FS
#0x001d:0x001d, #GS
#0x001e:0x001e, #RS
#0x001f:0x001f, #US
0x0020:0x0020, #<space> 
0x0021:0x0021, #!
0x0022:0x0022, #"
#0x0023:0x0023, ##
#0x0024:0x0024, #$
0x0025:0x0025, #%
0x0026:0x0026, #&
0x0027:0x0027, #'
0x0028:0x0028, #(
0x0029:0x0029, #)
0x002a:0x002a, #*
0x002b:0x002b, #+
0x002c:0x002c, #,
0x002d:0x002d, #-
0x002e:0x002e, #.
0x002f:0x002f, #/
0x0030:0x0030, #0
0x0031:0x0031, #1
0x0032:0x0032, #2
0x0033:0x0033, #3
0x0034:0x0034, #4
0x0035:0x0035, #5
0x0036:0x0036, #6
0x0037:0x0037, #7
0x0038:0x0038, #8
0x0039:0x0039, #9
0x003a:0x003a, #:
0x003b:0x003b, #;
0x003c:0x003c, #<
0x003d:0x003d, #=
0x003e:0x003e, #>
0x003f:0x003f, #?
#0x0040:0x0040, #@
0x0041:0x0041, #A
0x0042:0x0042, #B
0x0043:0x0043, #C
0x0044:0x0044, #D
0x0045:0x0045, #E
0x0046:0x0046, #F
0x0047:0x0047, #G
0x0048:0x0048, #H
0x0049:0x0049, #I
0x004a:0x004a, #J
0x004b:0x004b, #K
0x004c:0x004c, #L
0x004d:0x004d, #M
0x004e:0x004e, #N
0x004f:0x004f, #O
0x0050:0x0050, #P
0x0051:0x0051, #Q
0x0052:0x0052, #R
0x0053:0x0053, #S
0x0054:0x0054, #T
0x0055:0x0055, #U
0x0056:0x0056, #V
0x0057:0x0057, #W
0x0058:0x0058, #X
0x0059:0x0059, #Y
0x005a:0x005a, #Z
#0x005b:0x005b, #[
#0x005c:0x005c, #\
#0x005d:0x005d, #]
#0x005e:0x005e, #^
#0x005f:0x005f, #_
#0x0060:0x0060, #`
#0x0061:0x0061, #a
#0x0062:0x0062, #b
#0x0063:0x0063, #c
#0x0064:0x0064, #d
#0x0065:0x0065, #e
#0x0066:0x0066, #f
#0x0067:0x0067, #g
#0x0068:0x0068, #h
#0x0069:0x0069, #i
#0x006a:0x006a, #j
#0x006b:0x006b, #k
#0x006c:0x006c, #l
#0x006d:0x006d, #m
#0x006e:0x006e, #n
#0x006f:0x006f, #o
#0x0070:0x0070, #p
#0x0071:0x0071, #q
#0x0072:0x0072, #r
#0x0073:0x0073, #s
#0x0074:0x0074, #t
#0x0075:0x0075, #u
#0x0076:0x0076, #v
#0x0077:0x0077, #w
#0x0078:0x0078, #x
#0x0079:0x0079, #y
#0x007a:0x007a, #z
#0x007b:0x007b, #{
#0x007c:0x007c, #|
#0x007d:0x007d, #}
#0x007e:0x007e, #~
#0x007f:0x007f, #del
}
